Spring MVC অ্যাপ্লিকেশনের টেস্টিং একটি গুরুত্বপূর্ণ ধাপ, যা অ্যাপ্লিকেশনটির স্থিতিশীলতা এবং কার্যকারিতা নিশ্চিত করে। Spring Framework টেস্টিংয়ের জন্য বিভিন্ন উপায় সরবরাহ করে, যেমন JUnit, Mockito, এবং Spring TestContext Framework। Spring MVC অ্যাপ্লিকেশন টেস্ট করতে মূলত দুটি টেস্টিং স্ট্র্যাটেজি ব্যবহার করা হয়:
Spring MVC অ্যাপ্লিকেশন টেস্ট করার জন্য সবচেয়ে সাধারণ টুল হল JUnit এবং Spring TestContext Framework। এখানে, আমরা দেখব Spring MVC অ্যাপ্লিকেশন টেস্ট করার জন্য কিছু প্রাসঙ্গিক টুল এবং কৌশল।
Spring MVC কন্ট্রোলারের ইউনিট টেস্ট করার জন্য আমরা JUnit, Mockito এবং @WebMvcTest অ্যানোটেশন ব্যবহার করি। @WebMvcTest
শুধু MVC লেয়ার (কন্ট্রোলার) টেস্ট করতে ব্যবহৃত হয় এবং এটি Spring context লোড না করেই কন্ট্রোলার কন্টেক্সট তৈরি করে।
আমরা একটি কন্ট্রোলার টেস্ট করব যা User
ডেটা রিটার্ন করে।
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") Long id, Model model) {
User user = userService.getUserById(id);
model.addAttribute("user", user);
return "userProfile";
}
}
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
@ExtendWith(MockitoExtension.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Mock
private UserService userService;
private UserController userController;
@BeforeEach
public void setup() {
userController = new UserController(userService);
mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
}
@Test
public void testGetUserById() throws Exception {
User mockUser = new User(1L, "John", "john.doe@example.com");
when(userService.getUserById(1L)).thenReturn(mockUser);
mockMvc.perform(get("/user/1"))
.andExpect(status().isOk())
.andExpect(view().name("userProfile"))
.andExpect(model().attribute("user", mockUser));
}
}
এখানে:
@WebMvcTest
: এটি কেবলমাত্র Spring MVC কন্ট্রোলার টেস্ট করার জন্য ব্যবহৃত হয়।MockMvc
: এটি Spring MVC অ্যাপ্লিকেশনটির মধ্যে HTTP রিকোয়েস্ট সম্পাদন করতে ব্যবহৃত হয় এবং রেসপন্স পরীক্ষা করতে সহায়ক।Integration Testing-এ পুরো Spring context লোড করা হয় এবং প্রকৃত Spring MVC কন্ট্রোলার এবং সার্ভিস লেয়ারের মধ্যে ইন্টিগ্রেশন পরীক্ষা করা হয়। Spring Boot অ্যাপ্লিকেশনগুলির জন্য, @SpringBootTest
অ্যানোটেশন ব্যবহার করা হয়।
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@SpringBootTest
public class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUserById() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))
.andExpect(status().isOk())
.andExpect(view().name("userProfile"))
.andExpect(model().attributeExists("user"));
}
}
এখানে:
@SpringBootTest
: Spring Boot অ্যাপ্লিকেশনটির পুরো context লোড করে।MockMvc
: এটি HTTP রিকোয়েস্ট সম্পাদন এবং রেসপন্স পরীক্ষার জন্য ব্যবহৃত হয়।@MockBean
:@MockBean
ব্যবহার করে, Spring Boot অ্যাপ্লিকেশন টেস্টিংয়ের জন্য আমরা সার্ভিস লেয়ার এবং অন্যান্য ডিপেনডেন্সি মক (mock) করতে পারি। এটি মূলত ইন্টিগ্রেশন টেস্টিংয়ে ব্যবহৃত হয় এবং এটি স্প্রিং কন্টেক্সটে মক অবজেক্ট যোগ করতে সহায়ক।
@MockBean
উদাহরণ:import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@SpringBootTest
public class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService; // Mocking the UserService
@Test
public void testGetUserById() throws Exception {
User mockUser = new User(1L, "John", "john.doe@example.com");
given(userService.getUserById(1L)).willReturn(mockUser); // Mock service call
mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))
.andExpect(status().isOk())
.andExpect(view().name("userProfile"))
.andExpect(model().attribute("user", mockUser));
}
}
এখানে:
@MockBean
: UserService
মক করা হয়েছে এবং এটি Spring ApplicationContext-এ inject করা হয়েছে।given()
: Mockito এর মাধ্যমে মক ডেটা ফেরত দেওয়া হচ্ছে।@WebMvcTest
ব্যবহার করে কন্ট্রোলার টেস্টিং:@WebMvcTest
Spring MVC কন্ট্রোলার টেস্ট করার জন্য খুবই উপকারী। এটি Spring Boot Test Context লোড করে না, তবে শুধুমাত্র MVC context লোড করে, যার ফলে এটি দ্রুত এবং focused টেস্টিংয়ের জন্য আদর্শ।
@WebMvcTest
উদাহরণ:import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.beans.factory.annotation.Autowired;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(UserController.class) // Test specific controller only
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUserById() throws Exception {
mockMvc.perform(get("/user/1"))
.andExpect(status().isOk())
.andExpect(view().name("userProfile"))
.andExpect(model().attribute("user", new User(1L, "John", "john.doe@example.com")));
}
}
এখানে:
@WebMvcTest(UserController.class)
: এটি কেবলমাত্র UserController
টেস্ট করবে এবং Spring MVC context তৈরি করবে।MockMvc
: এটি HTTP রিকোয়েস্ট এবং রেসপন্স পরীক্ষা করার জন্য ব্যবহৃত হয়েছে।Mockito একটি জনপ্রিয় মকিং ফ্রেমওয়ার্ক যা Spring টেস্টিংয়ের জন্য ডিপেনডেন্সি মকিং এ সাহায্য করে। আমরা সার্ভিস, রিপোজিটরি এবং কন্ট্রোলারের মক অবজেক্ট তৈরি করতে পারি, যাতে টেস্ট শুধুমাত্র ফাংশনাল লজিক যাচাই করে।
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
public void testGetUserById() {
User user = new User(1L, "John", "john.doe@example.com");
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
User result = userService.getUserById(1L);
assertEquals("John", result.getName());
}
}
এখানে:
@Mock
: মক অবজেক্ট তৈরি করা হয়েছে।@InjectMocks
: সার্ভিস ক্লাসে মক অবজেক্ট ইনজেক্ট করা হয়েছে।Spring MVC অ্যাপ্লিকেশন টেস্টিং খুবই গুরুত্বপূর্ণ এবং এটি অ্যাপ্লিকেশনের কার্যকারিতা নিশ্চিত করার জন্য প্রয়োজনীয়। @WebMvcTest
, @SpringBootTest
, MockMvc, Mockito, JUnit সহ বিভিন্ন টুল ব্যবহার করে কন্ট্রোলার, সার্ভিস এবং রিপোজিটরি স্তরে টেস্টিং করা যায়। এই টেস্টিং কৌশলগুলি আপনাকে Spring MVC অ্যাপ্লিকেশনে গুণগতমান নিশ্চিত করতে সাহায্য করবে।
Spring MVC অ্যাপ্লিকেশনগুলির জন্য Unit Testing এবং Integration Testing খুবই গুরুত্বপূর্ণ, কারণ এগুলি নিশ্চিত করে যে আপনার কোড সঠিকভাবে কাজ করছে এবং বিভিন্ন কম্পোনেন্ট একসাথে ঠিকভাবে কাজ করছে। Spring Testing ফ্রেমওয়ার্ক JUnit, Mockito, এবং Spring Test সমর্থন করে, যা ইউনিট টেস্ট এবং ইন্টিগ্রেশন টেস্ট করার জন্য শক্তিশালী টুল সরবরাহ করে।
Unit Testing হল শুধুমাত্র একক ইউনিট (যেমন একটি মেথড বা ক্লাস) পরীক্ষা করা। Spring MVC অ্যাপ্লিকেশনের ক্ষেত্রে, এটি সাধারণত Controller, Service, এবং Repository-এর জন্য করা হয়।
Controller:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;
@Controller
public class MyController {
private final MyService myService;
public MyController(MyService myService) {
this.myService = myService;
}
@GetMapping("/greet")
public String greet(Model model) {
String message = myService.getGreetingMessage();
model.addAttribute("message", message);
return "greet";
}
}
Service:
import org.springframework.stereotype.Service;
@Service
public class MyService {
public String getGreetingMessage() {
return "Hello from Service!";
}
}
JUnit Test for Controller with Mockito:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.ui.Model;
import static org.mockito.Mockito.*;
public class MyControllerTest {
@Mock
private MyService myService;
@Mock
private Model model;
private MyController myController;
@BeforeEach
public void setup() {
MockitoAnnotations.openMocks(this); // Initialize mocks
myController = new MyController(myService);
}
@Test
public void testGreet() {
// Given
when(myService.getGreetingMessage()).thenReturn("Hello, Test!");
// When
String result = myController.greet(model);
// Then
verify(myService, times(1)).getGreetingMessage(); // Ensure method was called once
verify(model, times(1)).addAttribute("message", "Hello, Test!"); // Ensure model is updated
assertEquals("greet", result); // Check the view name
}
}
Explanation:
@Mock
অ্যানোটেশন ব্যবহার করে মক অবজেক্ট তৈরি করা হয়।when(myService.getGreetingMessage()).thenReturn("Hello, Test!")
: এটি myService.getGreetingMessage()
কল করার সময় একটি কাস্টম রেসপন্স প্রদান করে।verify()
: এটি নিশ্চিত করে যে মক অবজেক্টের উপর নির্দিষ্ট মেথড একাধিক বার কল হয়েছে কিনা।Integration Testing হল একাধিক কম্পোনেন্টের ইন্টিগ্রেশন পরীক্ষা করা, অর্থাৎ পুরো অ্যাপ্লিকেশন বা কিছু অংশের মেলবন্ধন পরীক্ষা করা। Spring MVC অ্যাপ্লিকেশনগুলিতে, Integration Testing সাধারণত Controller-এর সাথে Service, Repository ইত্যাদির কাজ নিশ্চিত করার জন্য করা হয়।
Spring Test Framework ব্যবহৃত হয় Spring MVC অ্যাপ্লিকেশনে ইনটিগ্রেশন টেস্ট পরিচালনা করতে।
Spring Boot Integration Test:
Spring Boot প্রকল্পে @SpringBootTest
এবং @WebMvcTest
অ্যানোটেশনগুলি ইনটিগ্রেশন টেস্টিংয়ের জন্য ব্যবহৃত হয়।
Controller Integration Test with @SpringBootTest
:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@SpringBootTest
public class MyControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGreet() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/greet"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.view().name("greet"))
.andExpect(MockMvcResultMatchers.model().attribute("message", "Hello from Service!"));
}
}
Explanation:
@SpringBootTest
: Spring Boot অ্যাপ্লিকেশনের সম্পূর্ণ কনটেক্সটে টেস্ট চালায়।MockMvc
: এটি Spring MVC কন্ট্রোলার মেথডগুলির HTTP রিকোয়েস্ট এবং রেসপন্স সিমুলেট করতে ব্যবহৃত হয়।MockMvcRequestBuilders.get("/greet")
: এটি /greet
URL এ GET রিকোয়েস্ট পাঠায়।andExpect()
: রিকোয়েস্টের পর ফলস্বরূপ status, view, এবং model যাচাই করা হয়।Service Layer Integration Test:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class MyServiceIntegrationTest {
@Autowired
private MyService myService;
@Test
public void testGetGreetingMessage() {
String message = myService.getGreetingMessage();
assertEquals("Hello from Service!", message);
}
}
Explanation:
@SpringBootTest
: Spring Boot অ্যাপ্লিকেশন কনটেক্সট লোড করে টেস্ট চালায়, যা প্রকৃত সার্ভিসের ইন্টিগ্রেশন নিশ্চিত করে।Spring Test ফ্রেমওয়ার্কে মকিং করতে Mockito ব্যবহার করা হয়। যখন আপনি প্রকৃত সার্ভিস বা ডাটাবেস ব্যবহার করতে না চান, তখন আপনি মক অবজেক্ট দিয়ে পরীক্ষাগুলি করতে পারেন।
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
public class MyServiceTest {
@Mock
private MyRepository myRepository;
@InjectMocks
private MyService myService;
@Test
public void testGetGreetingMessage() {
// Arrange
when(myRepository.getGreeting()).thenReturn("Mocked Greeting");
// Act
String message = myService.getGreetingMessage();
// Assert
assertEquals("Mocked Greeting", message);
verify(myRepository, times(1)).getGreeting(); // Ensure method was called
}
}
Explanation:
@Mock
: মক অবজেক্ট তৈরি করা হয়েছে।@InjectMocks
: সার্ভিস ক্লাসে মক অবজেক্ট ইনজেক্ট করা হয়।when()
: মক অবজেক্টে প্রেরিত মেথডের জন্য রিটার্ন মান সেট করা হয়।verify()
: এটি নিশ্চিত করে যে মক অবজেক্টের মেথডটি নির্দিষ্ট পরিমাণে কল হয়েছে কিনা।Spring MVC অ্যাপ্লিকেশনের Unit Testing এবং Integration Testing নিশ্চিত করতে আপনার কোডের কাজ সঠিকভাবে হচ্ছে এবং বিভিন্ন কম্পোনেন্ট একসাথে কার্যকরীভাবে কাজ করছে।
Spring Test Framework এবং JUnit, Mockito এর সাহায্যে Spring MVC অ্যাপ্লিকেশনগুলির ইউনিট ও ইন্টিগ্রেশন টেস্ট খুবই সহজ এবং শক্তিশালী।
Spring MVC অ্যাপ্লিকেশনে Controller Testing এর জন্য Mockito
এবং MockMvc
দুটি জনপ্রিয় টুল। Mockito
হল একটি মকিং ফ্রেমওয়ার্ক যা টেস্টিংয়ে ডিপেনডেন্সি মক (mock) করতে সাহায্য করে, এবং MockMvc
হল Spring Test-এর একটি অংশ যা Spring MVC কন্ট্রোলারগুলির জন্য HTTP রিকোয়েস্ট এবং রেসপন্স সিমুলেট করে। এ দুটি টুল ব্যবহার করে আপনি Spring MVC কন্ট্রোলারের কার্যকারিতা পরীক্ষা করতে পারেন।
MockMvc
এর মাধ্যমে আপনি কন্ট্রোলার মেথডগুলো HTTP রিকোয়েস্টের মাধ্যমে সিমুলেট করতে পারেন, এবং তারপরে তাদের আউটপুট যাচাই করতে পারেন।প্রথমে, আপনার pom.xml
ফাইলে Mockito
এবং Spring Test
ডিপেনডেন্সি যুক্ত করতে হবে।
<dependencies>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Mockito for mocking services or dependencies -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.9.0</version> <!-- Ensure the version is up to date -->
<scope>test</scope>
</dependency>
</dependencies>
spring-boot-starter-test
ডিপেনডেন্সি এতে MockMvc
, Mockito
, Spring Test
, JUnit
ইত্যাদি সমস্ত টেস্টিং টুল অন্তর্ভুক্ত করে।এখানে একটি উদাহরণ কন্ট্রোলার দেওয়া হল, যার জন্য আমরা টেস্ট তৈরি করব।
HomeController.java:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HomeController {
@GetMapping("/greet")
public String greet(@RequestParam String name) {
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException("Name cannot be empty");
}
return "Hello, " + name + "!";
}
}
এটি একটি সাধারণ কন্ট্রোলার মেথড, যা name
প্যারামিটার নিয়ে একটি গ্রিটিং রিটার্ন করবে। যদি name
প্যারামিটার শূন্য থাকে, তাহলে এটি একটি IllegalArgumentException ছুড়ে দেবে।
এখন আমরা Mockito
এবং MockMvc
ব্যবহার করে HomeController
এর টেস্ট তৈরি করব।
HomeControllerTest.java:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.mockito.Mockito.when;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@SpringBootTest
@ExtendWith(MockitoExtension.class)
public class HomeControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@BeforeEach
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void testGreetWithValidName() throws Exception {
mockMvc.perform(get("/greet")
.param("name", "John"))
.andExpect(status().isOk()) // Expect HTTP 200 OK status
.andExpect(content().string("Hello, John!")); // Expect "Hello, John!" in response body
}
@Test
public void testGreetWithEmptyName() throws Exception {
mockMvc.perform(get("/greet")
.param("name", ""))
.andExpect(status().isBadRequest()); // Expect HTTP 400 Bad Request due to IllegalArgumentException
}
@Test
public void testGreetWithNullName() throws Exception {
mockMvc.perform(get("/greet")
.param("name", (String) null))
.andExpect(status().isBadRequest()); // Expect HTTP 400 Bad Request due to IllegalArgumentException
}
}
MockMvc
setup: @Autowired WebApplicationContext
এবং MockMvcBuilders
ব্যবহার করে আমরা MockMvc
সেটআপ করেছি।testGreetWithValidName
: এটি /greet?name=John
URL এ GET রিকোয়েস্ট পাঠায় এবং Hello, John!
রেসপন্স আশা করে। যদি name
প্যারামিটার সঠিক থাকে, তবে HTTP 200 স্ট্যাটাস কোড এবং সঠিক কন্টেন্ট ফিরিয়ে আসবে।testGreetWithEmptyName
: এটি /greet?name=
URL এ GET রিকোয়েস্ট পাঠায় এবং প্রত্যাশা করে যে এটি HTTP 400 (Bad Request) ত্রুটি ফেরত দেবে, কারণ name
প্যারামিটার শূন্য।testGreetWithNullName
: এটি /greet?name=null
URL এ GET রিকোয়েস্ট পাঠায় এবং HTTP 400 (Bad Request) ত্রুটি প্রত্যাশা করে, কারণ name
প্যারামিটার null
।যেহেতু আমরা @SpringBootTest
এবং MockMvc
ব্যবহার করেছি, এখন আপনি এই টেস্টগুলি চালাতে পারেন JUnit বা Maven/Gradle ব্যবহার করে।
mvn test
MockMvc
ব্যবহারের মাধ্যমে আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের পরীক্ষা করতে পারেন, যা সরাসরি কন্ট্রোলারের কার্যকারিতা যাচাই করে।Mockito
সার্ভিস লেয়ার বা রেপোজিটরি মক করে এবং কন্ট্রোলারের সাথে ইন্টিগ্রেটেড টেস্ট করা হয়।MockMvc
হল Spring MVC এর ইনবিল্ট টুল যা আপনার কন্ট্রোলার মেথডে আসল HTTP রিকোয়েস্ট প্রেরণ করে এবং প্রত্যাশিত রেসপন্স মেলানো যাচাই করে।null
) পরীক্ষা করতে পারেন।Spring MVC তে Mockito এবং MockMvc ব্যবহার করে আপনি আপনার কন্ট্রোলারদের কার্যকারিতা অত্যন্ত সহজে এবং কার্যকরীভাবে টেস্ট করতে পারেন। MockMvc
HTTP রিকোয়েস্টের মাধ্যমে কন্ট্রোলারের আউটপুট যাচাই করতে সাহায্য করে, এবং Mockito
সার্ভিস বা রেপোজিটরি লেয়ারকে মক করে টেস্টকে আরও দ্রুত এবং নির্ভুল করতে সহায়ক হয়।
Spring MVC অ্যাপ্লিকেশন পরীক্ষা করার জন্য Spring Test ফ্রেমওয়ার্কে কয়েকটি শক্তিশালী টুল এবং কৌশল রয়েছে। Spring MVC টেস্টিং মূলত @WebMvcTest
, MockMvc
, এবং @SpringBootTest
ব্যবহার করে করা হয়। এই টেস্টিং টুলগুলির মাধ্যমে আপনি কন্ট্রোলার, রিকোয়েস্ট, রেসপন্স এবং অন্যান্য গুরুত্বপূর্ণ ফিচারগুলো সহজেই পরীক্ষা করতে পারেন।
এখানে, আমরা দেখবো কিভাবে Spring MVC অ্যাপ্লিকেশনে টেস্টিং করা যায়, বিশেষত কন্ট্রোলার টেস্ট করার জন্য।
MockMvc Spring Test ফ্রেমওয়ার্কের একটি কমপ্যাক্ট টুল যা HTTP রিকোয়েস্ট এবং রেসপন্স প্রক্রিয়া পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি অ্যাপ্লিকেশন কনটেক্সটে রিকোয়েস্ট পাঠানোর জন্য ব্যবহার করা হয়, কিন্তু ফ্যাক্টরী এবং সার্ভার রান করতে হয় না।
Spring MVC টেস্টিং এর জন্য আপনাকে spring-test
এবং spring-boot-starter-test
ডিপেন্ডেন্সি প্যাকেজ ইনস্টল করতে হবে।
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
ধরা যাক, আমাদের একটি HomeController
রয়েছে যেটি /home
URL তে রিকোয়েস্ট হ্যান্ডল করে।
@Controller
public class HomeController {
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "Welcome to Spring MVC Testing!");
return "home";
}
}
এখন, আমরা এই কন্ট্রোলারের টেস্ট করব।
Spring Test এর MockMvc ক্লাস ব্যবহার করে কন্ট্রোলার টেস্ট করা যাবে। নিচে একটি টেস্টের উদাহরণ দেওয়া হলো:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@WebMvcTest(HomeController.class)
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHome() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/home"))
.andExpect(MockMvcResultMatchers.status().isOk()) // Check if status is 200 OK
.andExpect(MockMvcResultMatchers.view().name("home")) // Check if view is 'home'
.andExpect(MockMvcResultMatchers.model().attribute("message", "Welcome to Spring MVC Testing!")); // Check model attribute
}
}
এখানে:
@WebMvcTest(HomeController.class)
: শুধুমাত্র HomeController
কন্ট্রোলার টেস্ট করার জন্য এই অ্যানোটেশন ব্যবহার করা হয়েছে।MockMvcRequestBuilders.get("/home")
: HTTP GET রিকোয়েস্ট তৈরি করা হচ্ছে।andExpect(MockMvcResultMatchers.status().isOk())
: স্ট্যাটাস কোড 200 (OK) যাচাই করা হচ্ছে।andExpect(MockMvcResultMatchers.view().name("home"))
: রেসপন্স ভিউ চেক করা হচ্ছে (এখানে "home"
ভিউ আশা করা হচ্ছে)।andExpect(MockMvcResultMatchers.model().attribute("message", "Welcome to Spring MVC Testing!"))
: মডেল অ্যাট্রিবিউট চেক করা হচ্ছে।এখন আপনি @Test
টেস্ট রান করলে HomeController এর /home
URL এ রিকোয়েস্ট পাঠিয়ে সঠিক রেসপন্স এবং মডেল যাচাই করতে পারবেন।
যদি আপনি পুরো Spring Boot অ্যাপ্লিকেশনটি টেস্ট করতে চান, তবে @SpringBootTest
ব্যবহার করতে পারেন। এটি সম্পূর্ণ অ্যাপ্লিকেশন কনটেক্সট লোড করে এবং রিয়েল HTTP রিকোয়েস্ট পাঠানোর মাধ্যমে টেস্ট করে।
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HomeControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testHomeIntegration() {
ResponseEntity<String> response = restTemplate.getForEntity("/home", String.class);
// Assert the response status and content
assert(response.getStatusCodeValue() == 200);
assert(response.getBody().contains("Welcome to Spring MVC Testing!"));
}
}
এখানে:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
: এটি Spring Boot অ্যাপ্লিকেশনকে ইন্টিগ্রেশন টেস্টের জন্য চালু করে এবং RANDOM_PORT
ব্যবহার করে টেস্ট সার্ভার চালু করে।TestRestTemplate
: এটি Spring Boot অ্যাপ্লিকেশনের সাথে HTTP রিকোয়েস্ট পাঠানোর জন্য ব্যবহৃত হয়।getForEntity("/home", String.class)
: এই কলটি /home
URL থেকে রেসপন্স ফেরত আনবে এবং তার কন্টেন্ট চেক করবে।এখন আপনি ইন্টিগ্রেশন টেস্ট চালিয়ে দেখতে পারেন যে, আপনার Spring MVC অ্যাপ্লিকেশন কিভাবে কাজ করছে। এই ধরনের টেস্টিং ফিচারটি ইউজার ইন্টারফেস এবং রিয়েল সার্ভার ইন্টারঅ্যাকশন নিশ্চিত করার জন্য গুরুত্বপূর্ণ।
MockMvc
ব্যবহার করে শুধুমাত্র কন্ট্রোলার এবং রিকোয়েস্ট-রেসপন্স প্রক্রিয়া টেস্ট করা হয়, ফলে দ্রুত টেস্ট রান করা যায়।@SpringBootTest
ব্যবহারে পুরো Spring Boot অ্যাপ্লিকেশন টেস্ট করা যায়।Spring MVC অ্যাপ্লিকেশন টেস্টিং গুরুত্বপূর্ণ অংশ এবং MockMvc, @WebMvcTest, এবং @SpringBootTest ব্যবহার করে আপনি সহজে কন্ট্রোলার এবং সম্পূর্ণ অ্যাপ্লিকেশন টেস্ট করতে পারেন। এই টেস্টিং প্রযুক্তিগুলি আপনাকে দ্রুত, নির্ভুল এবং কার্যকর টেস্টিং করার সুযোগ দেয়, যা আপনাকে নিরাপদ ও স্থিতিশীল কোড প্রদান করতে সহায়ক।
Read more